package y.q.h.service;



import y.q.h.util.apicontroller.R;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * super service
 *
 * @author SongRenShuo
 * @date 2023/09/05
 * @since 2023-08-18 01:22:22
 */
public interface SuperService<T, ID extends Serializable> {

    /**
     * 新增数据
     *
     * @param entity 条件
     * @return 影响行数
     */
    boolean insert(T entity);


    /**
     * 根据ID查询
     *
     * @param id id
     * @return 实体对象
     */
    T getById(ID id);

    /**
     * 根据ID查询 - Map专用
     *
     * @param id id
     * @return {@link T}
     */
    T getById(T id);

    /**
     * 单查 - 根据条件
     *
     * @param entity 条件
     * @return 实体对象
     */
    T queryEntity(T entity);

    /**
     * 修改数据
     *
     * @param entity 条件
     * @return 影响行数
     */
    boolean update(T entity);

    /**
     * 删除数据 - 通过ID
     *
     * @param id 主键
     * @return 影响行数
     */
    boolean deleteById(ID id);

    /**
     * 删除数据 - 通过ID - Map专用
     *
     * @param id id
     * @return boolean
     */
    boolean deleteById(T id);

    /**
     * 模糊查询 - 根据条件
     *
     * @param entity 条件
     * @return 实体对象列表
     */
    List queryLike(T entity);

    /**
     * 分页查询 - 支持模糊查询
     *
     * @param page 当前页
     * @param limit 限制条数
     * @param entity 条件
     * @return {@link List}<{@link T}>
     */
    List getByRowBoundsLike(Integer page ,Integer limit, T entity);

    /**
     * 精确查询 - 根据条件
     *
     * @param entity 条件
     * @return 实体对象列表
     */
    List query(T entity);

    /**
     * 分页查询 - 精确查询
     *
     * @param page 当前页
     * @param limit 限制条数
     * @param entity 条件
     * @return {@link List}<{@link T}>
     */
    List getByRowBounds(Integer page ,Integer limit, T entity);



    /**
     * 查询表中数据条数
     *
     * @param entity 实体
     * @return Integer
     */
    Integer count(T entity);

    /**
     * 登录二次验证
     *
     * @param entity 实体
     * @return {@link R}
     */
    R isAccount(T entity);


    /**
     * 登录 - 五表联查
     *
     * @param entity 条件
     * @return {@link List}<{@link Map}>
     */
    List<Map> getRbac(T entity);
}
